﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TrabalhoCG_PHONG
{
    public partial class FormRenderizador : Form
    {
        public FormRenderizador()
        {
            InitializeComponent();
        }

        private void setaValoresSuperficie(Superficie superficie)
        {
            superficie.A = (double)this.txtA.Value;
            superficie.B = (double)this.txtB.Value;
            superficie.C = (double)this.txtC.Value;
            superficie.D = (double)this.txtD.Value;
            superficie.E = (double)this.txtE.Value;
            superficie.F = (double)this.txtF.Value;
            superficie.G = (double)this.txtG.Value;
            superficie.H = (double)this.txtH.Value;
            superficie.J = (double)this.txtJ.Value;
            superficie.K = (double)this.txtK.Value;
        }

        private void setaValoresCamera(Camera camera)
        {
            // a os valores da dimensão(largura, altura) da câmera.
            camera.Altura = (int)this.txtTamAltura.Value;
            camera.Largura = (int)this.txtTamLargura.Value;

            // a o valor da distância focal.
            camera.DistanciaFocal = (double)this.txtFoco.Value;

            // a os valores da rotação da câmera em x,y,z.
            camera.RotacaoX = (double)this.txtCamRotX.Value;
            camera.RotacaoY = (double)this.txtCamRotY.Value;
            camera.RotacaoZ = (double)this.txtCamRotZ.Value;

            // a os valores do pixel x e do pixel y.
            camera.PixelX = (double)this.txtPixelX.Value;
            camera.PixelY = (double)this.txtPixelY.Value;

            // a os valores da posição da câmera em x,y,z.
            camera.PosicaoX = (double)this.txtCamPosX.Value;
            camera.PosicaoY = (double)this.txtCamPosY.Value;
            camera.PosicaoZ = (double)this.txtCamPosZ.Value;
        }

        private void setaValoresIluminacao(Iluminacao iluminacao)
        {
            //a a difusão
            iluminacao.DifusaoR = (double)this.txtDifusaoR.Value;
            iluminacao.DifusaoG = (double)this.txtDifusaoG.Value;
            iluminacao.DifusaoB = (double)this.txtDifusaoB.Value;

            //a o especular
            iluminacao.EspecularR = (double)this.txtEspecularR.Value;
            iluminacao.EspecularG = (double)this.txtEspecularG.Value;
            iluminacao.EspecularB = (double)this.txtEspecularB.Value;

            //a cor da iluminacao
            iluminacao.AmbienteR = (double)this.txtIlumAmbienteR.Value;
            iluminacao.AmbienteG = (double)this.txtIlumAmbienteG.Value;
            iluminacao.AmbienteB = (double)this.txtIlumAmbienteB.Value;

            //a o expoente especular
            iluminacao.ExpoenteEspecular = (double)this.txtIluminacaoN.Value;

            //a a posicao da iluminação
            iluminacao.PosicaoX = (double)this.txtLuzPosX.Value;
            iluminacao.PosicaoY = (double)this.txtLuzPosY.Value;
            iluminacao.PosicaoZ = (double)this.txtLuzPosZ.Value;

            //a a cor da luz
            iluminacao.CorLuzR = (double)this.txtLuzCorR.Value;
            iluminacao.CorLuzG = (double)this.txtLuzCorG.Value;
            iluminacao.CorLuzB = (double)this.txtLuzCorB.Value;
        }

        private void setaValoresAmbiente(Ambiente ambiente)
        {
            //a a cor da luz
            ambiente.R = (double)this.txtAmbienteCorR.Value;
            ambiente.G = (double)this.txtAmbienteCorG.Value;
            ambiente.B = (double)this.txtAmbienteCorB.Value;
        }

        private void btnRenderizarClick(object sender, EventArgs e)
        {
            Ambiente ambiente = new Ambiente();
            Superficie superficie = new Superficie();
            Camera camera = new Camera();
            Iluminacao iluminacao = new Iluminacao();

            // Obtém os valores da interface gráfica.
            setaValoresAmbiente(ambiente);
            setaValoresSuperficie(superficie);
            setaValoresCamera(camera);
            setaValoresIluminacao(iluminacao);

            // Inicializa o renderizador com os dados da câmera, superfície e iluminação.
            Renderizador render = new Renderizador(camera, superficie, iluminacao, ambiente);
            Bitmap imagem = render.renderizar();

            FormResultado formResultado = new FormResultado(imagem);
            formResultado.Size = new Size(imagem.Width, imagem.Height);
            formResultado.MinimumSize = formResultado.Size;

            formResultado.ShowDialog();
        }
    }
}
